{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "indian-elder", "metadata": {}, "outputs": [], "source": [ "# This tutorial shows how to create a function in Python in one .py file and\n", "# then import it as a module and execute it in another .py Python script.\n", "\n", "# The first example function will be used to calculate the factorial of n.\n", "# We will call this function 'fact' and it will be saved in the script\n", "# mod1.py'.\n", "\n", "# The format for entering this function is shown in the lines below.\n", "# They are commented out in this script, but these lines of code appear in\n", "# the file mod1.m.\n", "\n", "# def fact(n):\n", "# z = 1\n", "# for i in range(n):\n", "# z = z*(i+1)\n", "# return z" ] }, { "cell_type": "code", "execution_count": 2, "id": "difficult-captain", "metadata": {}, "outputs": [], "source": [ "# To call an execute this function, the file mod1.py must me in the same\n", "# directory as the current script that you're working in. Then, simply\n", "# import mod1.py and then call the function using `mod1.fact(n)' where n is \n", "# the integer that you want to take the factorial of.\n", "import mod1" ] }, { "cell_type": "code", "execution_count": 3, "id": "permanent-dating", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "120" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's the factorial of 5.\n", "x = mod1.fact(5)\n", "x" ] }, { "cell_type": "code", "execution_count": 4, "id": "appointed-variation", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "720" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's the factorial of 6.\n", "x = mod1.fact(6)\n", "x" ] }, { "cell_type": "code", "execution_count": 5, "id": "naughty-freedom", "metadata": {}, "outputs": [], "source": [ "# mod1.py also has a function to calculate the number of combinations for\n", "# selecting m objects for n. c = n!/((n - m)!m!). Here's the code that is\n", "# contained in mod1.py. Note that the 'choose' function relies on the 'fact' \n", "# function that is also contained in mod1.py.\n", "\n", "# def choose(n, m):\n", "# c = fact(n)/(fact(n - m)*fact(m))\n", "# return int(c)" ] }, { "cell_type": "code", "execution_count": 6, "id": "grand-progressive", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's 6 choose 3.\n", "x = mod1.choose(6, 3)\n", "x" ] }, { "cell_type": "code", "execution_count": 7, "id": "attractive-cartoon", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(120, 720)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Of course, a factorial function already exists in the 'math' module and we didn't need to write \n", "# our own.\n", "import math\n", "math.factorial(5), math.factorial(6)" ] }, { "cell_type": "code", "execution_count": 8, "id": "capital-federal", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# There is also a module/function for calculating combinations.\n", "from scipy.special import comb\n", "comb(6, 3, exact = True)" ] }, { "cell_type": "code", "execution_count": 9, "id": "sticky-dragon", "metadata": {}, "outputs": [], "source": [ "# Here's one more basic example. We will calculate the quadrature sum of an\n", "# array of numbers. The array will be passed to the function which will return\n", "# the scaler quadrature sum. This type of calculation is used often in \n", "# propagation of errors. It is also used to find the magnitude of a vector.\n", "\n", "# The following code is included in mod1.py:\n", "# def quad(xx):\n", "# total = 0\n", "# for i in range(len(xx)):\n", "# total = total + xx[i]**2\n", "# return total**0.5" ] }, { "cell_type": "code", "execution_count": 10, "id": "declared-bermuda", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.7416573867739413" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's the quadrature sum of 1, 2, 3: sqrt(1^2 + 2^2 + 3^2) = sqrt(14)\n", "xx = [1, 2, 3]\n", "mag = mod1.quad(xx)\n", "mag" ] }, { "cell_type": "code", "execution_count": 11, "id": "owned-commander", "metadata": {}, "outputs": [], "source": [ "# As a final example, we'll create a slightly more complicated function.\n", "# This function, called 'primes(a, b)' in the module mod2.py, will find all \n", "# of the prime numbers between input integers a and b. The function code \n", "# is shown below without any explanations. If you open the file mod2.py you \n", "# will find some comments that help explain the purpose of the\n", "# various lines of code. The function returns to values. The first is an\n", "# array of the prime numbers found is sequential order. The second item returned\n", "# is the number of primes that were found. The code also checks that the user\n", "# supplied appropriate inputs. The requirements are that a and b are positive\n", "# integers and that b > a.\n", "\n", "#def primes(a, b):\n", "# import numpy as np\n", "# primes = []\n", "# if a % 1 == 0 and b % 1 == 0 and a > 0 and b > 0 and b > a:\n", "# x = 0\n", "# for i in range (a, b + 1):\n", "# cnt = 0\n", "# if i != 1 and i % 2 == 1 and sum(map(int, str(i))) % 3 != 0\\\n", "# and i % 10 != 5 or i == 2 or i == 3 or i == 5:\n", "# j = 7\n", "# while j < i/(j - 2) and cnt == 0:\n", "# if i % j == 0:\n", "# cnt = 1\n", "# j = j + 2\n", "# if cnt == 0:\n", "# x = x + 1\n", "# primes = primes + [i]\n", "# f = np.array(primes)\n", "# n = len(f)\n", "# else:\n", "# f = 'ERROR: a and b in primes(a, b) must be positive integers with b > a.'\n", "# n = -1\n", "# return f, n " ] }, { "cell_type": "code", "execution_count": 12, "id": "acoustic-farming", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ERROR: a and b in primes(a, b) must be positive integers with b > a.\n", "-1\n" ] } ], "source": [ "# Here's what happens when mod2.primes(a, b) is called with bad inputs.\n", "import mod2\n", "xx, x = mod2.primes(6.2, -4)\n", "print(xx)\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 15, "id": "fabulous-formula", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 25 prime numbers between 1 and 100\n" ] }, { "data": { "text/plain": [ "array([ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,\n", " 61, 67, 71, 73, 79, 83, 89, 97])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's a couple of simple tests with sensible inputs.\n", "a = 1\n", "b = 100\n", "xx, x = mod2.primes(a, b)\n", "print('There are', x, 'prime numbers between', a, 'and', b)\n", "xx" ] }, { "cell_type": "code", "execution_count": 21, "id": "attended-beast", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 1134 prime numbers between 500 and 10000\n" ] }, { "data": { "text/plain": [ "array([ 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577,\n", " 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643,\n", " 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719,\n", " 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,\n", " 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,\n", " 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,\n", " 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021,\n", " 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093,\n", " 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181,\n", " 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259,\n", " 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,\n", " 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433,\n", " 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,\n", " 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579,\n", " 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657,\n", " 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741,\n", " 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831,\n", " 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913,\n", " 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003,\n", " 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087,\n", " 2089, 2099, 2111, 2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,\n", " 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269,\n", " 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347,\n", " 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417,\n", " 2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531,\n", " 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621,\n", " 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693,\n", " 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767,\n", " 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851,\n", " 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953,\n", " 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041,\n", " 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163,\n", " 3167, 3169, 3181, 3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251,\n", " 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329,\n", " 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,\n", " 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517,\n", " 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583,\n", " 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673,\n", " 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767,\n", " 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851, 3853,\n", " 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931,\n", " 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027,\n", " 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129,\n", " 4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229,\n", " 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,\n", " 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421,\n", " 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513,\n", " 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603,\n", " 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691,\n", " 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793,\n", " 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909,\n", " 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4987,\n", " 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077,\n", " 5081, 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171,\n", " 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,\n", " 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393,\n", " 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471,\n", " 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557,\n", " 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, 5651, 5653,\n", " 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741,\n", " 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839,\n", " 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903,\n", " 5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043,\n", " 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131,\n", " 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221,\n", " 6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311,\n", " 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379,\n", " 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521,\n", " 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607,\n", " 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703,\n", " 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791, 6793, 6803,\n", " 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899,\n", " 6907, 6911, 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983,\n", " 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079,\n", " 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,\n", " 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307,\n", " 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433,\n", " 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, 7523,\n", " 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589,\n", " 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687,\n", " 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789,\n", " 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883,\n", " 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009,\n", " 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101,\n", " 8111, 8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219,\n", " 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293,\n", " 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419,\n", " 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, 8527,\n", " 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627,\n", " 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, 8693, 8699, 8707,\n", " 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803,\n", " 8807, 8819, 8821, 8831, 8837, 8839, 8849, 8861, 8863, 8867, 8887,\n", " 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001,\n", " 9007, 9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103,\n", " 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199,\n", " 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293,\n", " 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397,\n", " 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467,\n", " 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587,\n", " 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679,\n", " 9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781,\n", " 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839, 9851, 9857, 9859,\n", " 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967,\n", " 9973])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = 500\n", "b = int(10e3)\n", "xx, x = mod2.primes(a, b)\n", "print('There are', x, 'prime numbers between', a, 'and', b)\n", "np.set_printoptions(threshold = 2000) # Tell Python to show the full array.\n", "xx" ] }, { "cell_type": "code", "execution_count": 17, "id": "welsh-thailand", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 16 prime numbers between 92939223 and 92939600\n" ] }, { "data": { "text/plain": [ "array([92939243, 92939261, 92939299, 92939311, 92939321, 92939377,\n", " 92939387, 92939401, 92939453, 92939467, 92939479, 92939501,\n", " 92939533, 92939543, 92939563, 92939593])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's try calling the function with some more interesting inputs.\n", "a = 92939223\n", "b = 92939600\n", "xx, x = mod2.primes(a, b)\n", "print('There are', x, 'prime numbers between', a, 'and', b)\n", "xx" ] }, { "cell_type": "code", "execution_count": 18, "id": "optimum-sampling", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2021-03-11 09:33:18.194563\n", "2021-03-11 09:33:33.894790\n", "78498\n" ] } ], "source": [ "# We can use our prime number function to find the number of prime numbers\n", "# between, say, 1 and 1e6 and write those numbers to a file.\n", "from datetime import datetime\n", "max_n = int(1e6)\n", "print(datetime.now())\n", "xx, x = mod2.primes(1, max_n)\n", "print(datetime.now())\n", "print(x)\n", "import numpy as np\n", "np.savetxt(\"Jupyter primes_1e6.txt\", xx, fmt=\"%s\")\n", "# This took about 15 seconds." ] }, { "cell_type": "code", "execution_count": 20, "id": "indoor-emerald", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Here's a plot of the number of prime numbers less than x versus x.\n", "import matplotlib.pyplot as plt\n", "plt.plot(xx, np.arange(1, len(xx) + 1, 1), linewidth = 2)\n", "plt.xlabel('x')\n", "plt.ylabel('Number of primes less than x')\n", "plt.axis((0, 1e6, 0, 8e4));" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }